package com.bjut.strategy.impl;

import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.bjut.constant.AuthConstants;
import com.bjut.domain.LoginSysUser;
import com.bjut.mapper.LoginSysUserMapper;
import com.bjut.model.SecurityUser;
import com.bjut.strategy.LoginStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;

import java.util.Set;

@Service(AuthConstants.SYS_USER_LOGIN)
public class SysUserLoginStrategy implements LoginStrategy {

    @Autowired
    private LoginSysUserMapper loginSysUserMapper;

    /**
     * 商城后台管理系统登录策略的具体实现
     * @param username
     * @return
     */
    @Override
    public UserDetails realLogin(String username) {

        // 根据用户名称查询用户对象
        LoginSysUser loginSysUser = loginSysUserMapper.selectOne(new LambdaQueryWrapper<LoginSysUser>()
                .eq(LoginSysUser::getUsername, username)
        );

        /**
         * SpringSecurity实现登录操作时，会自动去匹配密码，怎么实现的？这部分代码，不需要我们自己去写吗？
         *
         * Spring Security 在登录时会自动完成密码匹配的逻辑，我们 不需要自己写密码比对的代码,只需要：
         * 实现 UserDetailsService 接口（重点是 loadUserByUsername 方法）：
         *用它根据用户名从数据库查询用户信息。
         * 返回一个实现了 UserDetails 接口的对象（里面要包含用户名和密码）。
         * 配置一个密码加密器 PasswordEncoder（比如 BCryptPasswordEncoder）。
         */


        /*LoginSysUser loginSysUser = loginSysUserMapper.selectOne(new QueryWrapper<LoginSysUser>()
                .eq("username", username)
        );*/
        if (ObjectUtil.isNotNull(loginSysUser)) {
            // 根据用户标识查询用户的权限集合
            Set<String> perms = loginSysUserMapper.selectPermsByUserId(loginSysUser.getUserId());
            // 创建安全用户对象SecurityUser
            SecurityUser securityUser = new SecurityUser();
            securityUser.setUserId(loginSysUser.getUserId());
            securityUser.setPassword(loginSysUser.getPassword());
            securityUser.setShopId(loginSysUser.getShopId());
            securityUser.setStatus(loginSysUser.getStatus());
            securityUser.setLoginType(AuthConstants.SYS_USER_LOGIN);
            // 判断用户权限是否有值
            if (CollectionUtil.isNotEmpty(perms) && perms.size() != 0) {
                securityUser.setPerms(perms);
            }

            // 这时已经将登录用户认证对象交由SpringSecurity框架来管理了；
            return securityUser;
        }

        return null;

    }
}
